package main

import "fmt"

/*
与普通的函数相比，结构体的方法在 func 关键字后面多了一个 (<ref name> <Name>) 结构。当方法中需要引用到结构体中的字段或者结构体其他方法时，需要使用这个 ref name,这个 ref name 相当于这个方法中提前声明的一个结构体类型的局部变量。Name 则是结构体名称。

Go 中没有方法重写的规则，即不允许相同名称的方法存在，即使方法的参数不同。

Go 中，结构体类型的变量和结构体类型指针的变量都可以直接访问结构体中声明的字段和调用声明的方法。

Go 中，没有结构体构造函数，构造函数都是自己开发者自定义的，一般是按照习惯，定义一个名称是 New<struct Name> 的函数来实例化一个比较复杂的结构体
*/
func main() {
	man := Man{Name: "张佳伟", age: 32}
	boy := calculate(15)
	oldMan := man.calculate(32)

	fmt.Println(man.Name)
	fmt.Println(boy)
	fmt.Println(oldMan)
}

type Man struct {
	Name string
	age  int
}

// 结构体方法：有接收者，可以直接访问结构体字段
func (man *Man) calculate(age int) string {
	fmt.Println(man.Name)
	man.Name = "sb"
	if age < 18 {
		return "未成年"
	} else {
		return "成年人"
	}
}

// 普通函数：没有接收者，需要通过参数访问结构体字段
func calculate(age int) string {
	if age < 18 {
		return "未成年"
	} else {
		return "成年人"
	}
}
